import os
import shutil


class FileManager(object):
    """
    文件管理器
    """

    @staticmethod
    def open_file(file_path):
        """
        打开文件
        :param file_path:
        :return:
        """
        if os.path.isfile(file_path):
            file = open(file_path)
            file_info = file.read()
            file.close()
            return file_info

    @staticmethod
    def get_file_name(file_path):
        """
        根据路径获取文件名
        :param file_path:
        :return:
        """
        file_name = os.path.basename(file_path)
        print(file_name)
        return file_name

    @staticmethod
    def get_file_type(file_name):
        """
        根据文件名获取文件名称和类型
        :param file_name:
        :return:
        """
        file_name, file_type = os.path.splitext(file_name)
        print(file_name, file_type)
        return file_name, file_type

    @staticmethod
    def get_file_dir_path(file_path):
        """
        根据路径获取文件所在目录
        :param file_path:
        :return:
        """
        file_dir_path = os.path.dirname(file_path)
        print(file_dir_path)
        return file_dir_path

    @staticmethod
    def get_file_abs_path(file_path):
        """
        根据路径获取文件绝对路径
        :param file_path:
        :return:
        """
        file_dir_path = os.path.abspath(file_path)
        print(file_dir_path)
        return file_dir_path

    @staticmethod
    def copy_file_to_dir(file_path, specify_dir, peer_copy=False, source_dir=None):
        """
        文件复制到指定目录
        :param file_path: 文件路径
        :param specify_dir: 指定拷贝目录
        :param peer_copy: 同级拷贝  为TRUE，按源目录结构存放文件
        :param source_dir: 源文件开始目录
        :return:
        """
        file_name = os.path.basename(file_path)
        file_path = os.path.abspath(file_path)
        file_dir_path = os.path.dirname(file_path)
        specify_dir_path = os.path.abspath(specify_dir)
        if not os.path.exists(specify_dir_path):
            os.mkdir(specify_dir_path)

        if peer_copy:
            source_dir_path = os.path.abspath(source_dir)
            if source_dir_path in file_dir_path:
                dir_path = file_dir_path.split(source_dir)[-1].split("/")
                for dir_name in dir_path:
                    specify_dir_path = os.path.join(specify_dir_path, dir_name)
                    if not os.path.exists(specify_dir_path):
                        os.mkdir(specify_dir_path)
            else:
                return

        specify_file_path = os.path.join(specify_dir_path, file_name)
        print(specify_file_path)
        shutil.copyfile(file_path, specify_file_path)

    def copy_source_dir_file_to_specify_dir(self, source_dir, specify_dir, peer_copy=False, copy_special=False):
        """
        复制源目录文件到指定目录
        :param source_dir: 源目录
        :param specify_dir: 指定拷贝目录
        :param peer_copy: 同级拷贝  为TRUE，按源目录结构存放文件
        :param copy_special: 拷贝特殊文件
        :return:
        """
        for file_name in os.listdir(source_dir):
            if not copy_special:
                if file_name.startswith("."):
                    continue
            file_path = os.path.join(source_dir, file_name)
            # 判断是文件还是文件夹
            if os.path.isfile(file_path):
                specify_dir_file_path = os.path.join(specify_dir, file_name)
                shutil.copyfile(file_path, specify_dir_file_path)
                print(specify_dir_file_path)
            else:
                if peer_copy:
                    specify_dir_file_path = os.path.join(specify_dir, file_name)
                    if not os.path.exists(specify_dir_file_path):
                        os.mkdir(specify_dir_file_path)
                    self.copy_source_dir_file_to_specify_dir(file_path, specify_dir_file_path, peer_copy)
                else:
                    self.copy_source_dir_file_to_specify_dir(file_path, specify_dir, peer_copy)


if __name__ == '__main__':
    file_manager = FileManager()
    file_manager.copy_source_dir_file_to_specify_dir("service/light/project/IND_Alaba", "service/light/src", True)
